﻿using System;
using System.Collections.Generic;
using System.Linq;
using Onshi.POS.Modelo.Entidades;
using Onshi.POS.Modelo.Enumeradores;
using Onshi.POS.Modelo.Objetos;
using Onshi.POS.Repositorios;
using Onshi.POS.Ubicaciones.Vistas;

namespace Onshi.POS.Ubicaciones
{
    public class BarriosAltaBajaModificacionPresentador
    {
        #region Constructores

        public BarriosAltaBajaModificacionPresentador(IBarriosAltaBajaModificacion vista)
        {
            this.vista = vista;
        }

        #endregion

        #region Atributos

        private IBarriosAltaBajaModificacion vista;
        private List<Barrio> lista;

        #endregion

        #region Propiedades

        private RepositorioLocalidad RepositorioLocalidad
        {
            get { return new RepositorioLocalidad(); }
        }

        private RepositorioBarrio RepositorioBarrio
        {
            get { return new RepositorioBarrio(); }
        }

        private RepositorioRegistro RepositorioRegistro
        {
            get { return new RepositorioRegistro(); }
        }

        private RepositorioTipoRegistro RepositorioTipoRegistro
        {
            get { return new RepositorioTipoRegistro(); }
        }

        private RepositorioVendedor RepositorioVendedor
        {
            get { return new RepositorioVendedor(); }
        }

        #endregion

        #region Metodos

        private void ActualizarLista()
        {
            lista = RepositorioBarrio.DevolverTodos();
        }

        private List<Barrio> FiltrarLista()
        {
            if (lista != null)
            {
                var consulta = (from item in lista
                                where item.Nombre.Trim().ToLower().Contains(vista.NombreFiltro.Trim().ToLower())
                                & item.Localidad.Id == (vista.IdLocalidadFiltro == (Int32)EnumLocalidad.TODAS ? item.Localidad.Id : vista.IdLocalidadFiltro)
                                & item.CodigoPostal.Trim().ToLower().Contains(vista.CodigoPostalFiltro.Trim().ToLower())
                                select item).ToList();
                return consulta;
            }
            else
                return lista;
        }

        public void Inicializar()
        {
            ActualizarLista();
            vista.Lista = lista;
        }

        public void Aceptar()
        {
            switch (vista.EstadoABM)
            {
                case EnumEstadoAltaBajaModificacionHabilitacion.ALTA:
                    if (!DatosComunes.TienePermiso(EnumPermiso.BARRIO_ALTA))
                        throw new Exception(DatosComunes.SinPermiso);
                    break;
                case EnumEstadoAltaBajaModificacionHabilitacion.MODIFICACION:
                    if (!DatosComunes.TienePermiso(EnumPermiso.BARRIO_MODIFICACION))
                        throw new Exception(DatosComunes.SinPermiso);
                    break;
            }
            if (vista.EstadoABM == EnumEstadoAltaBajaModificacionHabilitacion.MODIFICACION)
            {
                if (vista.IdBarrio == (Int32)EnumBarrio.SIN_ESPECIFICAR)
                    throw new Exception("El barrio no se puede modificar");
                if (RepositorioBarrio.DevolverPorId(vista.IdBarrio) == null)
                    throw new Exception("El barrio no existe");
            }
            var barrio = new Barrio();
            barrio.Localidad = RepositorioLocalidad.DevolverPorId(vista.IdLocalidad);
            if (barrio.Localidad == null)
                throw new Exception("La localidad no existe");
            barrio.Nombre = vista.Nombre.Trim();
            if (barrio.Nombre == String.Empty)
                throw new Exception("El nombre no puede quedar vacio");
            barrio.CodigoPostal = vista.CodigoPostal.Trim();
            Int32 codigoPostal;
            if (barrio.CodigoPostal != String.Empty && !Int32.TryParse(barrio.CodigoPostal, out codigoPostal))
                throw new Exception("El código postal debe ser numérico");
            var registro = new Registro();
            registro.Usuario = DatosComunes.Usuario;
            switch (vista.EstadoABM)
            {
                case EnumEstadoAltaBajaModificacionHabilitacion.ALTA:
                    registro.Tipo = RepositorioTipoRegistro.DevolverPorId((Byte)EnumTipoRegistro.BARRIO_ALTA);
                    break;
                case EnumEstadoAltaBajaModificacionHabilitacion.MODIFICACION:
                    registro.Tipo = RepositorioTipoRegistro.DevolverPorId((Byte)EnumTipoRegistro.BARRIO_MODIFICACION);
                    break;
            }
            if (registro.Tipo == null)
                throw new Exception("El tipo de registro no existe");
            switch (vista.EstadoABM)
            {
                case EnumEstadoAltaBajaModificacionHabilitacion.ALTA:
                    RepositorioBarrio.Insertar(barrio);
                    break;
                case EnumEstadoAltaBajaModificacionHabilitacion.MODIFICACION:
                    barrio.Id = vista.IdBarrio;
                    RepositorioBarrio.Modificar(barrio);
                    break;
            }
            RepositorioRegistro.Insertar(registro);
            ActualizarLista();
            vista.Lista = FiltrarLista();
        }

        public void Eliminar()
        {
            if (!DatosComunes.TienePermiso(EnumPermiso.BARRIO_BAJA))
                throw new Exception(DatosComunes.SinPermiso);
            if (vista.IdBarrio == (Int32)EnumBarrio.SIN_ESPECIFICAR)
                throw new Exception("El barrio no se puede eliminar");
            var barrio = RepositorioBarrio.DevolverPorId(vista.IdBarrio);
            if (barrio == null)
                throw new Exception("El barrio no existe");
            var barrioPorDefecto = RepositorioBarrio.DevolverPorId((Int32)EnumBarrio.SIN_ESPECIFICAR);
            if (barrioPorDefecto == null)
                throw new Exception("El barrio por defecto no existe");
            var registro = new Registro();
            registro.Usuario = DatosComunes.Usuario;
            registro.Tipo = RepositorioTipoRegistro.DevolverPorId((Byte)EnumTipoRegistro.LOCALIDAD_BAJA);
            if (registro.Tipo == null)
                throw new Exception("El tipo de registro no existe");
            RepositorioVendedor.ModificarDomiciliosBarrios(barrio, barrioPorDefecto);
            RepositorioBarrio.Eliminar(barrio);
            RepositorioRegistro.Insertar(registro);
            ActualizarLista();
            vista.Lista = FiltrarLista();
        }

        public void Actualizar()
        {
            ActualizarLista();
            vista.Lista = FiltrarLista();
        }

        public void Filtrar()
        {
            vista.Lista = FiltrarLista();
        }

        public void Imprimir()
        {
            vista.ListaReporte = FiltrarLista();
        }

        #endregion
    }
}